local-serverless-stack 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -3
- package/README.md +92 -38
- package/bin/cli.js +218 -28
- package/bin/i18n.js +57 -3
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/namespaces/services.d.ts +46 -0
- package/dist/client/namespaces/services.d.ts.map +1 -1
- package/dist/client/namespaces/services.js +1 -0
- package/dist/client/namespaces/services.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +17 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/engine/backends/self-backend.d.ts +26 -1
- package/dist/server/engine/backends/self-backend.d.ts.map +1 -1
- package/dist/server/engine/backends/self-backend.js +104 -11
- package/dist/server/engine/backends/self-backend.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js +12 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts +3 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js +78 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts +11 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/index.js +101 -7
- package/dist/server/engine/emulators/dynamodb/index.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/query.d.ts +1 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/query.js +34 -6
- package/dist/server/engine/emulators/dynamodb/query.js.map +1 -1
- package/dist/server/engine/emulators/s3/index.d.ts +10 -0
- package/dist/server/engine/emulators/s3/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/s3/index.js +369 -25
- package/dist/server/engine/emulators/s3/index.js.map +1 -1
- package/dist/server/engine/emulators/sqs/index.d.ts +2 -0
- package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/sqs/index.js +70 -7
- package/dist/server/engine/emulators/sqs/index.js.map +1 -1
- package/dist/server/engine/emulators/sqs/queue.d.ts +2 -1
- package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -1
- package/dist/server/engine/emulators/sqs/queue.js +68 -35
- package/dist/server/engine/emulators/sqs/queue.js.map +1 -1
- package/dist/server/engine/emulators/ssm/index.d.ts +31 -0
- package/dist/server/engine/emulators/ssm/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/ssm/index.js +670 -0
- package/dist/server/engine/emulators/ssm/index.js.map +1 -0
- package/dist/server/engine/http/errors.d.ts +1 -0
- package/dist/server/engine/http/errors.d.ts.map +1 -1
- package/dist/server/engine/http/errors.js +13 -5
- package/dist/server/engine/http/errors.js.map +1 -1
- package/dist/server/engine/http/is-aws-request.d.ts.map +1 -1
- package/dist/server/engine/http/is-aws-request.js +13 -3
- package/dist/server/engine/http/is-aws-request.js.map +1 -1
- package/dist/server/engine/http/protocols/aws-json.d.ts +1 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -1
- package/dist/server/engine/http/protocols/aws-json.js +13 -0
- package/dist/server/engine/http/protocols/aws-json.js.map +1 -1
- package/dist/server/engine/http/reset.d.ts +4 -0
- package/dist/server/engine/http/reset.d.ts.map +1 -0
- package/dist/server/engine/http/reset.js +17 -0
- package/dist/server/engine/http/reset.js.map +1 -0
- package/dist/server/engine/http/router.d.ts +1 -0
- package/dist/server/engine/http/router.d.ts.map +1 -1
- package/dist/server/engine/http/router.js +185 -34
- package/dist/server/engine/http/router.js.map +1 -1
- package/dist/server/engine/types.d.ts +2 -1
- package/dist/server/engine/types.d.ts.map +1 -1
- package/dist/server/routes/apis.d.ts.map +1 -1
- package/dist/server/routes/apis.js +6 -0
- package/dist/server/routes/apis.js.map +1 -1
- package/dist/server/routes/config.d.ts.map +1 -1
- package/dist/server/routes/config.js +25 -1
- package/dist/server/routes/config.js.map +1 -1
- package/dist/server/routes/lambdas.d.ts.map +1 -1
- package/dist/server/routes/lambdas.js +12 -0
- package/dist/server/routes/lambdas.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +66 -5
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/runtime/runtime-worker.js +40 -3
- package/dist/server/runtime/runtime-worker.js.map +1 -1
- package/dist/server/services/api-gateway-events.d.ts +14 -0
- package/dist/server/services/api-gateway-events.d.ts.map +1 -1
- package/dist/server/services/api-gateway-events.js +114 -8
- package/dist/server/services/api-gateway-events.js.map +1 -1
- package/dist/server/services/artifact-staleness.d.ts +20 -0
- package/dist/server/services/artifact-staleness.d.ts.map +1 -0
- package/dist/server/services/artifact-staleness.js +115 -0
- package/dist/server/services/artifact-staleness.js.map +1 -0
- package/dist/server/services/authorizer-service.d.ts +34 -5
- package/dist/server/services/authorizer-service.d.ts.map +1 -1
- package/dist/server/services/authorizer-service.js +0 -0
- package/dist/server/services/authorizer-service.js.map +1 -1
- package/dist/server/services/cache-manager.d.ts +5 -0
- package/dist/server/services/cache-manager.d.ts.map +1 -1
- package/dist/server/services/cache-manager.js.map +1 -1
- package/dist/server/services/cfn-intrinsics.d.ts +63 -0
- package/dist/server/services/cfn-intrinsics.d.ts.map +1 -0
- package/dist/server/services/cfn-intrinsics.js +403 -0
- package/dist/server/services/cfn-intrinsics.js.map +1 -0
- package/dist/server/services/cfn-physical-values.d.ts +51 -0
- package/dist/server/services/cfn-physical-values.d.ts.map +1 -0
- package/dist/server/services/cfn-physical-values.js +186 -0
- package/dist/server/services/cfn-physical-values.js.map +1 -0
- package/dist/server/services/cloudformation-parser.d.ts +26 -3
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +79 -7
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +49 -2
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +206 -24
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/gateway-manager.d.ts.map +1 -1
- package/dist/server/services/gateway-manager.js +52 -20
- package/dist/server/services/gateway-manager.js.map +1 -1
- package/dist/server/services/lambda-runtime-manager.d.ts +2 -0
- package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -1
- package/dist/server/services/lambda-runtime-manager.js +49 -15
- package/dist/server/services/lambda-runtime-manager.js.map +1 -1
- package/dist/server/services/raw-api-assembler.d.ts +1 -1
- package/dist/server/services/raw-api-assembler.d.ts.map +1 -1
- package/dist/server/services/raw-api-assembler.js +18 -8
- package/dist/server/services/raw-api-assembler.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts +31 -1
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +257 -25
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/s3-explorer.js +1 -1
- package/dist/server/services/seed-manager.d.ts.map +1 -1
- package/dist/server/services/seed-manager.js +11 -6
- package/dist/server/services/seed-manager.js.map +1 -1
- package/dist/server/services/serverless-state-parser.d.ts +45 -2
- package/dist/server/services/serverless-state-parser.d.ts.map +1 -1
- package/dist/server/services/serverless-state-parser.js +217 -29
- package/dist/server/services/serverless-state-parser.js.map +1 -1
- package/dist/server/services/service-graph.d.ts +76 -0
- package/dist/server/services/service-graph.d.ts.map +1 -0
- package/dist/server/services/service-graph.js +914 -0
- package/dist/server/services/service-graph.js.map +1 -0
- package/dist/server/services/service-registrar.d.ts +17 -1
- package/dist/server/services/service-registrar.d.ts.map +1 -1
- package/dist/server/services/service-registrar.js +190 -66
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/server/services/service-scanner.d.ts +7 -2
- package/dist/server/services/service-scanner.d.ts.map +1 -1
- package/dist/server/services/service-scanner.js +53 -7
- package/dist/server/services/service-scanner.js.map +1 -1
- package/dist/server/services/source-watcher.d.ts +1 -0
- package/dist/server/services/source-watcher.d.ts.map +1 -1
- package/dist/server/services/source-watcher.js +19 -1
- package/dist/server/services/source-watcher.js.map +1 -1
- package/dist/server/services/worker-runtime.d.ts +82 -0
- package/dist/server/services/worker-runtime.d.ts.map +1 -0
- package/dist/server/services/worker-runtime.js +303 -0
- package/dist/server/services/worker-runtime.js.map +1 -0
- package/dist/ui/assets/ApisPage-BkW-QZ0X.js +1 -0
- package/dist/ui/assets/BucketDetailPage-CJwTQJh7.js +1 -0
- package/dist/ui/assets/BucketsPage-B1xPVhZC.js +1 -0
- package/dist/ui/assets/DynamoPage-DvbpwZDc.js +1 -0
- package/dist/ui/assets/DynamoTablePage-xn3Lq3so.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-BhUyO77H.js +4 -0
- package/dist/ui/assets/LambdasPage-CUF_4rOH.js +1 -0
- package/dist/ui/assets/OnboardingPage-U49THUzu.js +1 -0
- package/dist/ui/assets/OpenSearchCollectionPage-BJTVNCq4.js +1 -0
- package/dist/ui/assets/OpenSearchPage-4s-egkB9.js +1 -0
- package/dist/ui/assets/OverviewPage-DJeJQktG.js +1 -0
- package/dist/ui/assets/{OverviewPage-C1pBJ8aP.css → OverviewPage-DjQETmb_.css} +1 -1
- package/dist/ui/assets/QueueDetailPage-DWsy5Yt8.js +1 -0
- package/dist/ui/assets/QueuesPage-BZJSqman.js +1 -0
- package/dist/ui/assets/SecretsPage-YC9ua54G.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-Cum5frP4.js +2 -0
- package/dist/ui/assets/ServicesPage-IpaPDuqx.js +2 -0
- package/dist/ui/assets/SettingsPage-BiCRU8O6.js +1 -0
- package/dist/ui/assets/index-BDlrAJhi.css +1 -0
- package/dist/ui/assets/index-BouKSS43.js +38 -0
- package/dist/ui/assets/resourceIcons-DZs28nbs.js +1 -0
- package/dist/ui/index.html +5 -2
- package/package.json +1 -1
- package/dist/ui/assets/ApisPage-BOuimwWz.js +0 -1
- package/dist/ui/assets/BucketDetailPage-vLYwhoQt.js +0 -1
- package/dist/ui/assets/BucketsPage-Cu5lU1Hp.js +0 -1
- package/dist/ui/assets/DynamoPage-y3TTEPUL.js +0 -1
- package/dist/ui/assets/DynamoTablePage-BnmSRZjc.js +0 -3
- package/dist/ui/assets/LambdaDetailPage-B5q_d27t.js +0 -4
- package/dist/ui/assets/LambdasPage-CJpRoEDx.js +0 -1
- package/dist/ui/assets/OnboardingPage-D02dymQi.js +0 -1
- package/dist/ui/assets/OpenSearchCollectionPage-B_wWTlfL.js +0 -1
- package/dist/ui/assets/OpenSearchPage-BLEgfF_g.js +0 -1
- package/dist/ui/assets/OverviewPage-EdJWiAt6.js +0 -1
- package/dist/ui/assets/QueueDetailPage-ByEYHvHe.js +0 -1
- package/dist/ui/assets/QueuesPage-CvwYHSll.js +0 -1
- package/dist/ui/assets/SecretsPage-DASw8Ntf.js +0 -1
- package/dist/ui/assets/ServiceDetailPage-BMsUDg6L.js +0 -2
- package/dist/ui/assets/ServicesPage-2JuiIiRr.js +0 -2
- package/dist/ui/assets/SettingsPage-DStO4bgN.js +0 -1
- package/dist/ui/assets/index-BIEznsi4.js +0 -37
- package/dist/ui/assets/index-BRMvNP3Y.css +0 -1
- package/dist/ui/assets/resourceIcons-baecADXA.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,126 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.1.0] - 2026-10-18
|
|
11
|
+
|
|
12
|
+
**Templates that run on AWS now run on LSS without an adapter.** A real serverless stack names its
|
|
13
|
+
resources with `!Sub '${AWS::StackName}-orders'`, hands them to functions as `!Ref OrdersTable`,
|
|
14
|
+
points its authorizer at `!GetAtt AuthorizerLambdaFunction.Arn` and leans on S3, SQS and API
|
|
15
|
+
Gateway behaving exactly as AWS does. Each of those used to need a workaround outside LSS; this
|
|
16
|
+
release closes them in the engine, the template pipeline, the Lambda runtime and the gateway.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **SSM Parameter Store** in the self engine (AWS JSON 1.1, `AmazonSSM.*`): `PutParameter`
|
|
21
|
+
(`String`/`StringList`/`SecureString`, `Overwrite` versioning, `AllowedPattern`, tiers, `DataType`,
|
|
22
|
+
AWS name and hierarchy rules), `GetParameter(s)` with `name:version` / `name:label` selectors,
|
|
23
|
+
`GetParametersByPath` (`Recursive`, filters, paging), `DescribeParameters`, `GetParameterHistory`,
|
|
24
|
+
`LabelParameterVersion`, `DeleteParameter(s)` and tagging. `AWS::SSM::Parameter` is provisioned at
|
|
25
|
+
registration. `SecureString` is not encrypted: without `WithDecryption` an opaque deterministic
|
|
26
|
+
token stands in for the ciphertext.
|
|
27
|
+
- **CloudFormation intrinsics.** A static pass resolves `Parameters` (defaults), pseudo parameters,
|
|
28
|
+
`Mappings`, `Conditions` and `Fn::Sub` / `Join` / `Select` / `Split` / `If` / `FindInMap` /
|
|
29
|
+
`GetAZs` / `Base64` / `ImportValue` before any resource is read; a resource whose `Condition` is
|
|
30
|
+
false is not created. After provisioning, `Ref`/`GetAtt` in function environments become physical
|
|
31
|
+
values — table name, queue URL, stream ARN, secret ARN with its suffix, collection endpoint.
|
|
32
|
+
Authorizers given as `!GetAtt X.Arn`, `Ref`, `!Sub '${X.Arn}'` or `$ref` resolve to the local
|
|
33
|
+
function.
|
|
34
|
+
- **Registration diagnostics**: one summary warning listing the resource types LSS does not
|
|
35
|
+
provision (with counts), a warning for an authorizer whose target cannot be found, and one for a
|
|
36
|
+
packaged stage that differs from the packaging command's `--stage` or the previous registration.
|
|
37
|
+
- **`lss reset`** / `POST /_lss/reset` — empties every emulator in place without restarting or
|
|
38
|
+
rebinding the port, persistent and in-memory alike. Loopback-only and gated on the
|
|
39
|
+
`x-lss-confirm-reset: true` header (a CORS preflight the route never answers, so a web page cannot
|
|
40
|
+
trigger it).
|
|
41
|
+
- **S3 bucket configuration**: Put/Get/DeleteBucketEncryption (none → SSE-S3 `AES256`, as AWS since
|
|
42
|
+
2023), tagging, Public Access Block and policy (stored, not enforced). Objects keep
|
|
43
|
+
`Content-Disposition`, `Cache-Control`, `Content-Encoding`, `Content-Language`, `Expires` and their
|
|
44
|
+
SSE headers across PutObject, presigned POST and CopyObject.
|
|
45
|
+
- **SQS**: `ListDeadLetterSourceQueues`, `ListQueues` `MaxResults`/`NextToken` paging, and
|
|
46
|
+
`MaximumMessageSize` enforced on body plus attributes.
|
|
47
|
+
- **DynamoDB TTL sweep**: expired items are deleted by a 30 s background pass (not only on read),
|
|
48
|
+
emitting the stream `REMOVE` with the TTL service identity, so TTL-triggered Lambdas fire on
|
|
49
|
+
their own.
|
|
50
|
+
- **Per-service / per-function runtime overrides**: `serviceRuntime.<svc>.env`, `.execArgv` and
|
|
51
|
+
`.functions.<fn>.env`. `env` is re-read per invocation, so an edit applies without a restart.
|
|
52
|
+
- **`selfEngine.fallbackEndpoints`** (per service, by SigV4 signing name) and the
|
|
53
|
+
`LSS_FALLBACK_ENDPOINT` env var for the catch-all.
|
|
54
|
+
- **API Gateway authorizer cache stats** on `GET /api/apis/authorizer-cache`; dashboard `?region=`
|
|
55
|
+
deep links.
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
|
|
59
|
+
- **Lambda authorizer policies are evaluated** against the request's `methodArn` (`*`/`?`
|
|
60
|
+
wildcards, explicit `Deny` wins). Any `Allow` used to authorize every route. The *policy* is
|
|
61
|
+
cached — one cache per authorizer per API — and re-evaluated per request.
|
|
62
|
+
- **Authorizer errors map like AWS**: a REST authorizer throwing exactly `Unauthorized` is 401;
|
|
63
|
+
any other failure, or a response without `policyDocument.Statement`, is 500. HTTP API authorizer
|
|
64
|
+
failures are 500.
|
|
65
|
+
- **A missing REST route is 403 `Missing Authentication Token`** (HTTP API keeps 404), and `OPTIONS`
|
|
66
|
+
is answered automatically only when CORS is configured.
|
|
67
|
+
- **SQS dead-lettering happens on the receive** that would push `ApproximateReceiveCount` past
|
|
68
|
+
`maxReceiveCount`, not the instant the visibility lapses — the message is still in its source
|
|
69
|
+
queue (and still deletable) in between, as on AWS.
|
|
70
|
+
- **DynamoDB rejects bare reserved words** in expressions (`… reserved keyword: status`), rejects
|
|
71
|
+
`ConsistentRead` on a GSI, caps Query/Scan pages at 1 MB, and evaluates `a <> :v` as true when
|
|
72
|
+
`a` is absent.
|
|
73
|
+
- **`selfEngine.port` defaults to `serverPort`**: setting only `serverPort` / `LSS_DASHBOARD_PORT`
|
|
74
|
+
moves the whole stack instead of also opening 14566.
|
|
75
|
+
- **An explicit `--config` / `LSS_CONFIG` that is missing or unparseable is a hard error** for every
|
|
76
|
+
command, instead of falling back to the default search (which let `lss stop --config ./wrong.json`
|
|
77
|
+
stop another instance).
|
|
78
|
+
- **Lambda workers point at the engine**: `AWS_ENDPOINT_URL`, `test` credentials and the service
|
|
79
|
+
region are set; inherited session tokens, profiles and role credentials are removed. Docs now say
|
|
80
|
+
`AWS_ENDPOINT_URL`, the variable the SDKs actually read.
|
|
81
|
+
- **Unsupported-service errors come back in the caller's protocol** (AWS JSON, Query XML, S3 XML or
|
|
82
|
+
rest-json), name `service.Operation` and link to the coverage table on GitHub.
|
|
83
|
+
- `GET /api/config` exposes runtime `env` maps as key names only (`envKeys`).
|
|
84
|
+
- Dependencies refreshed: `source-map-js`, `handlebars`, `proxy-addr`, `shell-quote` /
|
|
85
|
+
`concurrently`, `brace-expansion`, `adm-zip`, `js-yaml`, `@humanfs/node`,
|
|
86
|
+
`postcss-selector-parser`, and `undici` / `fast-uri` / `js-yaml` in the examples and fixtures.
|
|
87
|
+
- **The repository is English-only.** English was already the language of the source, but not of
|
|
88
|
+
everything around it. Translated: the two PRDs (`docs/PRD_SELF_ENGINE.md`,
|
|
89
|
+
`docs/PRD_API_LAMBDA_EMULATION.md`), the dashboard's UI/UX contract (`src/ui/ui-ux.md`), the
|
|
90
|
+
archived design proposal, the 2026-07-29 handoff — renamed `REVISAO-2026-07-29.md` →
|
|
91
|
+
`REVIEW-2026-07-29.md` — plus the `.vscode/tasks.json` labels/details, the last Portuguese line of
|
|
92
|
+
`TODO.md` and two CHANGELOG entries that quoted CLI output verbatim. What stays non-English is
|
|
93
|
+
what has to: the `pt-BR`/`es` translation catalogues, the language endonyms
|
|
94
|
+
(`Português (BR)`, `Español`), the `sa-east-1 — São Paulo` region label, the `confirmar` token
|
|
95
|
+
`seed:clear` asks the operator to type, and the tests that assert on translated CLI output.
|
|
96
|
+
|
|
97
|
+
### Fixed
|
|
98
|
+
|
|
99
|
+
- **S3 subresources no longer fall through**: `PUT /bucket?encryption` was a 409
|
|
100
|
+
`BucketAlreadyOwnedByYou`, `DELETE /bucket?tagging` deleted the bucket and `PUT /key?tagging`
|
|
101
|
+
overwrote the object. Unsupported subresources now answer `NotImplemented` (501).
|
|
102
|
+
- **SQS receipt handles**: deleting with the latest handle after the visibility lapsed answered
|
|
103
|
+
200 and left the message to redeliver; `VisibilityTimeout: 0` left the message invisible until
|
|
104
|
+
the queue timer fired, so an immediate peek missed it roughly half the time.
|
|
105
|
+
- **Artifact mode loads ESM bundles with external packages** — ESM ignores `NODE_PATH`, so LSS now
|
|
106
|
+
links `node_modules` next to the extraction.
|
|
107
|
+
- **Event wiring without an invoke port**: SQS/stream mappings, EventBridge targets and S3
|
|
108
|
+
notifications failed to wire when a service declared no `invokePort`; they are delivered
|
|
109
|
+
in-process.
|
|
110
|
+
- **Function env no longer leaks** between functions sharing a worker.
|
|
111
|
+
- **Hot reload ignores LSS's own state**: a `stateDir` / `dataDir` inside a service caused an
|
|
112
|
+
endless restart loop.
|
|
113
|
+
- **The API Gateway path is decoded once** (`%2525` reached handlers as `%`).
|
|
114
|
+
- **The fallback proxy normalizes a duplicated `Date` header**, which broke the SDK's clock-skew
|
|
115
|
+
correction from the second call on.
|
|
116
|
+
- **Unsigned `GET /?Action=…`** reached the dashboard instead of the engine.
|
|
117
|
+
|
|
118
|
+
- **The dashboard's detected language now reaches `<html lang>` at boot.** The locale resolution
|
|
119
|
+
(stored choice → `navigator.languages` → English) already ran on load, but only an explicit switch
|
|
120
|
+
in the ⋮ menu wrote the result to the document. A browser set to pt-BR therefore got a fully
|
|
121
|
+
translated dashboard that still declared `lang="en"` — the tag `index.html` can only ship
|
|
122
|
+
statically — so screen readers announced Portuguese with English pronunciation and the browser's
|
|
123
|
+
own translate prompt offered to translate a page already in the reader's language. Resolution and
|
|
124
|
+
the manual switch now share one `applyDocumentLang()`, and `tests/unit/ui/i18n-messages.test.ts`
|
|
125
|
+
pins the whole chain (browser languages, stored override, storage disabled, boot, switch) against
|
|
126
|
+
a stubbed browser.
|
|
127
|
+
|
|
8
128
|
## [1.0.0] - 2026-07-31
|
|
9
129
|
|
|
10
130
|
**LSS runs on one engine.** The LocalStack backend is gone — not deprecated, removed. The self
|
|
@@ -503,7 +623,7 @@ Corrections from integrating LSS 0.5.0 in a real monorepo using osls 4, serverle
|
|
|
503
623
|
- **Native TypeScript source loading when available**: in `source` mode, the runtime worker now tries Node's native TypeScript type stripping (`process.features.typescript`) before requiring `esbuild-register`, `tsx`, or `ts-node`.
|
|
504
624
|
|
|
505
625
|
### Fixed
|
|
506
|
-
- **Artifact resolution for osls/serverless package output**: `package.artifact` values such as `
|
|
626
|
+
- **Artifact resolution for osls/serverless package output**: `package.artifact` values such as `acme-identity.zip` are now resolved relative to `.serverless/` as well as the service root, and nonexistent declared candidates no longer suppress the `.serverless/*.zip` scan fallback.
|
|
507
627
|
- **Stale LocalStack proxy `INVOKE_URL`**: re-registering a service now updates an existing proxy Lambda when the expected invoke URL changed (port renumbering or `invokeHost` changes).
|
|
508
628
|
- **Service identity collisions**: service registration now uses the `service:` name from `serverless-state.json` instead of the directory basename, with migration for same-root legacy cache entries.
|
|
509
629
|
- **Event source mapping fidelity**: CloudFormation `StartingPosition`, `MaximumRetryAttempts`, `FunctionResponseTypes`, `MaximumBatchingWindowInSeconds`, `FilterCriteria`, and `DestinationConfig.OnFailure` are parsed/applied where supported; duplicate checks compare the resolved live ARN instead of unresolved CFN refs.
|
|
@@ -581,13 +701,13 @@ Testability features for downstream e2e suites: an isolated test instance and a
|
|
|
581
701
|
## [0.1.2] - 2026-05-26
|
|
582
702
|
|
|
583
703
|
### Added
|
|
584
|
-
- **`npx lss seed:clear` now requires interactive confirmation**: before issuing any `DeleteRequest`, the CLI lists the exact LocalStack tables it would wipe, prints the LocalStack URL, makes the "this never touches AWS" guarantee explicit, and waits for the user to type `confirmar` (case-sensitive, exact match after trim). Anything else cancels with `🚫
|
|
704
|
+
- **`npx lss seed:clear` now requires interactive confirmation**: before issuing any `DeleteRequest`, the CLI lists the exact LocalStack tables it would wipe, prints the LocalStack URL, makes the "this never touches AWS" guarantee explicit, and waits for the user to type `confirmar` (case-sensitive, exact match after trim). Anything else cancels with `🚫 Cancelled — nothing was changed.` and no clear call is made. `--yes` / `-y` skips the prompt for CI use.
|
|
585
705
|
- **Defensive endpoint guard in `SeedManager`**: `clearTable` and `clearAllSeeded` now refuse to run unless the resolved DynamoDB endpoint hostname is on a hardcoded local allowlist (`localhost`, `127.0.0.1`, `::1`, `0.0.0.0`, `host.docker.internal`, `localstack`, `lss-localstack`, `lss-localstack-<port>`, `*.localhost`). If a future refactor ever pointed `LocalStackManager.getConfig()` at a real AWS endpoint, the guard would throw `Refusing destructive operation: endpoint "..." is not a recognized local LocalStack host. seed:clear may ONLY run against LocalStack — never against AWS.` before any AWS SDK call. Architecture already pinned writes to LocalStack via fake credentials; this is belt-and-braces.
|
|
586
706
|
- **Seed/clear mismatch diagnostic**: `GET /api/seeds` now also returns `liveTables: string[]` (every DynamoDB table currently in LocalStack). When `npx lss seed` skips tables or `npx lss seed:clear` finds no live targets, the CLI prints a two-column diagnostic — seed files inspected on one side, live LocalStack tables on the other — with the hint "Os nomes dos arquivos de seed precisam bater EXATAMENTE com o `TableName` no CloudFormation." This makes seed-name/table-name typos obvious instead of "nothing happened, why?". When the live-tables list is empty, the CLI falls back to the older "run `npx lss start` + `npx serverless deploy` first" hint.
|
|
587
707
|
- **Test infrastructure**: new `tests/unit/seed-manager-guard.test.ts` (27 tests covering the endpoint allowlist matrix, IPv6 bracket handling, malformed URLs, and that `clearTable`/`clearAllSeeded` invoke the guard) and `tests/unit/cli-seed.test.ts` (21 tests spawning `bin/cli.js` against an in-process HTTP stub of the orchestrator — covers confirmation flow, `--yes`/`-y` bypass, "no live tables" diagnostic, name-mismatch diagnostic, and `formatError` robustness against 500-with-empty-body / 500-with-non-JSON / `{error: ""}` responses).
|
|
588
708
|
|
|
589
709
|
### Changed
|
|
590
|
-
- **`bin/cli.js` error handling never leaves the user with an empty message**: new `formatError(e)` and `buildHttpError(res, data)` helpers walk a fallback chain (`e.message` → `e.code` → `e.name` → body snippet → HTTP status text → "
|
|
710
|
+
- **`bin/cli.js` error handling never leaves the user with an empty message**: new `formatError(e)` and `buildHttpError(res, data)` helpers walk a fallback chain (`e.message` → `e.code` → `e.name` → body snippet → HTTP status text → "unknown error (no details)") so a response 500 with no body, a socket reset during orchestrator startup, or an `Error` with empty `.message` all produce a useful CLI line instead of `❌ Could not list the tables before clearing:` with a blank suffix. Applied to every `console.error` path in `seed`, `seed:clear`, and the underlying `getJson`/`postJson` helpers.
|
|
591
711
|
- **`npx lss seed` hint when tables are missing in LocalStack**: previously printed a generic "tabelas foram puladas" footer. Now it fetches `liveTables` and shows the same mismatch diagnostic as `seed:clear`, so the user sees whether the cause is "I haven't deployed yet" (no live tables) or "my seed file name is wrong" (live tables exist but don't match).
|
|
592
712
|
- **`firstPositional()` arg parser in the CLI**: commands that accept an optional table name (`seed`, `seed:clear`) now skip args starting with `-`. Without this, `npx lss seed:clear --yes` was interpreting `--yes` as the table name.
|
|
593
713
|
- **`SeedManager.assertLocalEndpoint` normalizes IPv6 brackets** so URLs like `http://[::1]:4566` (which `new URL().hostname` reports as `[::1]`) match the `::1` entry in the allowlist instead of being rejected as non-local.
|
|
@@ -958,6 +1078,8 @@ Not applicable (initial release)
|
|
|
958
1078
|
|
|
959
1079
|
## [Unreleased]
|
|
960
1080
|
|
|
1081
|
+
## [1.1.0] - 2026-10-18
|
|
1082
|
+
|
|
961
1083
|
### Planned Features
|
|
962
1084
|
- S3 bucket provisioning
|
|
963
1085
|
- EventBridge integration
|